package com.xtwy.controller;

import com.xtwy.model.Message;
import com.xtwy.model.Response;
import com.xtwy.service.WebSocketService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.security.Principal;

/**
 * @作 者: 侯建军
 * @日 期: 2018/8/11 16:56
 * @描 述:
 * @公 司：山西迅腾伟业
 */
@CrossOrigin
@Controller
public class WebSocketController {
    @Autowired
    private WebSocketService ws;
    //注入消息模板
    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    @RequestMapping(value = "/login")
    public String login(){
        return  "login";
    }

    /**
     * WebSocket连接
     * @return
     */
    @RequestMapping(value = "/ws")
    public String ws(){
        return  "ws";
    }

    /**
     * 聊天界面
     * @return
     */
    @RequestMapping(value = "/chat")
    public String chat(){
        return  "chat";
    }

    @MessageMapping("/welcome")
    //浏览器发送请求通过@messageMapping 映射/welcome 这个地址。
    @SendTo("/topic/getResponse")
    //服务器端有消息时,会订阅@SendTo 中的路径的浏览器发送消息。
    public Response say(Message message) throws Exception {
        System.out.println("客户端订阅消息");
        Thread.sleep(1000);
        //消息回应
        return new Response("来自请求/welcome请求，服务回应消息：, " + message.getName() + "!");
    }

    /**
     * broadcast
     * @return
     * @throws Exception
     */
    @RequestMapping("/broadcast")
    @ResponseBody
    public String broadcast()throws Exception
    {
        ws.sendMessage();
        return "消息已广播";
    }

    @MessageMapping("/chat")
    //在springmvc 中可以直接获得principal,principal 中包含当前用户的信息
    public void handleChat(Principal principal, Message message) {

        /**
         * 此处是一段硬编码。如果发送人是wyf 则发送给 wisely 如果发送人是wisely 就发送给 wyf。
         * 通过当前用户,然后查找消息,如果查找到未读消息,则发送给当前用户。
         */
        if (principal.getName().equals("admin")) {
            //通过convertAndSendToUser 向用户发送信息,
            // 第一个参数是接收消息的用户,第二个参数是浏览器订阅的地址,第三个参数是消息本身
            messagingTemplate.convertAndSendToUser("houjianjun",
                    "/queue/notifications", principal.getName() + "-发送:"
                            + message.getName());
            /**
             * 相当于
             * messagingTemplate.convertAndSend("/user/houjianjun/queue/notifications",principal.getName() + "-发送:"
             + message.getName());
             */
        } else {
            messagingTemplate.convertAndSendToUser("admin",
                    "/queue/notifications", principal.getName() + "-发送:"
                            + message.getName());
        }
    }
}
